\chapter{Benchmark \label{benchmark}}
Die in Kapitel \ref{implementierung} vorgestellten Filter sollen hier einem groben Vergleich unterzogen werden. Dabei dienen zwei Kenngrößen als Kriterium: Die Optische Qualität der Renderings im Vergleich mit dem Referenzrendering aus Abschnitt \ref{testvolumen}, sowie die Laufzeit der einzelnen Renderingprozesse. 
\section{Visuelle Qualität}
Alle Filter rekonstruieren eine gesampelte Version des Testvolumens von Marschner und Lobb. Das Ergebnis ist daher mit dem Referenzrendering in Abbilung \ref{marschnerLobb} zu vergleichen. 

\subsection{Trilineare Filter}
\begin{figure}[]
\centering
\subfloat[Hardwarefilter]{\includegraphics[scale=\scale]{img/getVoxel.png}} \quad
\subfloat[Softwarefilter]{\includegraphics[scale=\scale]{img/trilinearFilter.png}}
\caption{Rendering durch trilineare Filterung}
\label{renderingTrilinear}
\end{figure}
Abbildung \ref{renderingTrilinear} zeigt die Ergebnisse der trilinearen Filter. Bis auf minimale Unterschiede gleichen sich die Hardwarefilterung (a) und der trilineare Filter aus \ref{trilinearFilter} (b) weitgehend. Auffällig sind bei beiden die starken Abweichungen vom Original durch die gebildeten Zacken, wobei die Softwareversion besser abschneidet. 

\subsection{Sinc Filter}
\begin{figure}
\centering
\subfloat[Lanczos Filter (simpel) mit {$r = 2$}]{\includegraphics[scale=\scale]{img/simpleLanczosFilter-2.png}} \quad
\subfloat[Lanczos Filter (optimiert) mit {$r = 2$}]{\includegraphics[scale=\scale]{img/lanczosFilter-2.png}} \\
\subfloat[Lanczos Filter (optimiert) mit {$r = 3$}]{\includegraphics[scale=\scale]{img/lanczosFilter-3.png}} \quad
\subfloat[Abgeschnittener Sinc Filter mit {$r = 3$}]{\includegraphics[scale=\scale]{img/sincFilter-3.png}}
\caption{Rendering durch (gefensterte) Sinc Filter}
\label{renderingSinc}
\end{figure}
Erwartungsgemäß entsprechen sich die Renderings des nicht optimierten (a) und des optimierten (b) Lanczos Filters, wie es in Abbildung \ref{renderingSinc} zu sehen ist. Die Zacken sind weniger stark ausgeprägt, als bei dem Trilinearen Filter. Für den Fall $r = 3$ bildet sich eine noch stabilere Form heraus (c). Der abgeschnittene Sinc Filter mit $r = 3$ (d), erhält die Struktur des Originals ebenfalls gut, bildet aber mehr Artefakte. Diese sind vermutlich die Konsequenz des abrupten Abbruchs der Faltung bei $r = 3$, da die $sinc$-Funktion darüber hinaus noch relativ stark um null oszilliert und die Rekonstruktion des Signals dementsprechend nicht unerheblich verfälscht wird.
\subsection{Kubische Filter}
\begin{figure}
\centering
\subfloat[B-Spline Filter ({$B=1, C=0$})]{\includegraphics[scale=\scale]{img/bSplineFilter.png}} \quad
\subfloat[Catmull-Rom Filter ({$B=0, C=0.5$})]{\includegraphics[scale=\scale]{img/catmullRomFilter.png}} \quad
\subfloat[Kubischer Filter ({$B=0.4, C=0.4$})]{\includegraphics[scale=\scale]{img/cubicFilter-0,4-0,4.png}} 
\caption{Rendering durch kubische Filter}
\label{renderingKubisch}
\end{figure}
Die Auswahl Kubischer Filter in Abbildung \ref{renderingKubisch} zeigt verschiedene Wahlen von $B$ und $C$. Der B-Spline Filter (a) unterdrückt zwar die Bildung der Zacken, flacht aber auch die Wellenform im Vergleich zum Original stark ab, während der Catmull-Rom Filter (b) sich gegenteilig verhält. Im Kontrast dazu kann der Kubische Filter mit den Parametern $B = C = 0.4$ dahingehend als Kompromiss angesehen werden. Viele weitere Kombinationen von $B$ und $C$ sind möglich. Der Catmull-Rom Filter kann mit dem Lanczos Filter für $r = 2$ mithalten und bildet dabei sogar weniger Artefakte.
\subsection{Gauss Filter}
\begin{figure}[]
\centering
\subfloat[Gauss Filter ({$\sigma = 0.5$})]{\includegraphics[scale=\scale]{img/gaussFilter-0,5.png}} \quad
\subfloat[Gauss Filter ({$\sigma = 0.6$})]{\includegraphics[scale=\scale]{img/gaussFilter-0,6.png}} \quad
\subfloat[Gauss Filter ({$\sigma = 0.7$})]{\includegraphics[scale=\scale]{img/gaussFilter-0,7.png}}
\caption{Rendering durch verschiedene Gauss Filter}
\label{renderingGauss}
\end{figure}
In Abbildung \ref{renderingGauss} sind Gauss Filter für verschiedene Wahlen von $\sigma$ zu sehen, wobei $\sigma = 0.6$ (b) einen Kompromiss zwischen dem artefaktbehafteten $\sigma = 0.5$ (a) und dem stark unscharfen $\sigma = 0.7$ (c) Rendering ist. Insgesamt ist die Wellenform des Testvolumens nur sehr schwach ausgeprägt.
\pagebreak
\section{Performance}
Voreen bietet mittels eines Python-Skripts die Möglichkeit eines Benchmarks. Die implementierten Filter wurden damit einer kurzen und groben Messung unterzogen, um die Größenordnung ihrer Performance einzuschätzen und ihre Praxistauglichkeit zu bestimmen. \\ Bei der Messung kam eine nVidia GeForce GTX 460 mit 1 GB GDDR5-RAM bei 256 Bit Anbindung zum Einsatz. Getestet wurde in der Konfiguration A ein $41 \times 41 \times 41$ Voxel großes Volumen (\verb|marschnerlobb.dat|) und in der Konfiguration B ein Volumen mit der praxisrelevanteren Größe $128 \times 96 \times 114$ (\verb|walnut.dat|). Die Testvolumen wurden mit dem "`SingleVolumeRaycaster"' ohne Beleuchtung bei einer Sampling-Rate von $3.5$ auf eine Zielgröße von $200 \times 200 $ Pixeln gerendert. Größere Auflösungen brachten die verwendete Grafikkarte leicht zum Absturz. \\ Beide Volumen wurden zur besseren Vergleichbarkeit mit der selben Transferfunktion gerendert. Außerdem wurde die in Abschnitt \ref{anwendung} beschriebene Early Ray Termination durch setzen von \lstinline|EARLY_RAY_TERMINATION_OPACITY| in dem Shader \verb|mod_raysetup.frag| auf \lstinline|1.0| deaktiviert. Dadurch werden beim Raycasting alle Strahlen immer bis zum Ende des Volumens traversiert, sodass der Aufwand bei unterschiedlich transparenten Volumen gleich bleibt. Tabelle \ref{benchmarkTabelle} listet die Ergebnisse auf. 
\begin{table}
\centering
\begin{tabular}{|c||c|D{.}{,}{-1}|D{.}{,}{-1}| D{.}{,}{5} |D{.}{,}{7}|}
\hline
\multirow{2}{*}{Filter} & \multirow{2}{*}{Bilder} & \multicolumn{2}{c|}{Laufzeit (s)} & \multicolumn{2}{c|}{Bilder pro Sekunde (FPS)} \\
& & A & B & A & B \\
\hline
\hline Lanczos (simpel) $r=2$ & 1000 & 257.71 & 664.28 & 3.88 & 1.55\\ 
\hline Lanczos (optimiert) $r = 2$ & 1000 & 171.05 & 515.43 & 5.85 & 1.94 \\ 
\hline Lanczos (optimiert) $r = 3$ & 1000 & 590.96 & 1711.28 & 1.69 & 0.58 \\ 
\hline Sinc $r = 3$ & 1000 & 591.51 & 1712.58 & 1.69 & 0.58\\ 
\hline Gauss & 1000 & 251.62 & 722.08 & 3.97 & 1.39 \\ 
\hline Catmull-Rom & 1000 & 260.99 & 743.71 & 3.83 & 1.35 \\ 
\hline B-Spline & 1000 & 260.05 & 740.69 & 3.85 & 1.35 \\ 
\hline Trilinear (Software) & 10000 & 52.12 & 123.64 & 191.86 & 80.88 \\ 
\hline Trilinear (Hardware) & 10000 & 24.56 & 63.98 & 407.25 & 156.30 \\ 
\hline Testvolumen & 10000 & \multicolumn{2}{D{.}{,}{-1}|}{67.24} & \multicolumn{2}{D{.}{,}{-1}|}{148.73} \\ 
\hline 
\end{tabular}  
\caption{Performance-Ergebnisse des Benchmarks}
\label{benchmarkTabelle}
\end{table}\\
\\
Den Erwartungen entsprechend steigert die Optimierung des Lanczos Filters die Performance. Aber auch wenn die FPS-Rate um mehr als $25\%$ beziehungsweise $50\%$ wächst, bleibt sie noch immer auf einem niedrigen Niveau. Dafür wird in der optimierten Version nun ein Radius von drei möglich. Generell brachte ein Radius größer drei die Grafikkarte zum Absturz - völlig unabhängig von der verwendeten Filtermethode. Der Sinc Filter berechnet zwar nur einen Sinus pro Sample, bleibt aber trotzdem auf dem Niveau des Lanczos mit dem gleichen Radius, auch wenn dieser im Vergleich sehr viele teure trigonometrische Berechnungen durchführt. Dies deutet darauf hin, dass hier nicht mehr die Berechnungen an sich ausschlaggebend sind, sondern dass die massive Zahl an Texture-Lookups der limitierende Faktor ist. Dieser wächst mit dem Radius kubisch und beträgt bei $r=3$ bereits $(2 \cdot 3 +1)^3 = 343 $ pro Rekonstruktion. Bei $r = 4$ wächst diese Zahl auf $729$ und sprengt daher anscheinend die Möglichkeiten der verwendeten Grafikkarte, da diese dann bei den Berechnungen abstürzt. Dass für die Berechnung des Testvolumens zwar keine Texture-Lookups, aber viele teure trigonometrische Funktionen zum Einsatz kommen, untermauert diese Vermutung, da dessen FPS-Rate beim Rendering sehr hoch ist. \\
Der Gauss Filter hat einen Radius von zwei und ist daher schneller als der Lanczos Filter. Dass sich die beiden kubischen Filter in ihren Performancewerten gleichen, überrascht nicht, da es sich um denselben Algorithmus handelt. Hier sind noch spezielle Optimierungen möglich, da für B-Spline Filter beispielsweise einige Terme durch die Parameterwahl $C = 0$ annulliert  werden. Der Trilineare Filter ist überragend schnell, beschränkt sich aber auch nur auf einen Radius von eins. Die Hardwareimplementierung überbietet selbst diesen. 

\section{Fazit}
Die Messung offenbart eine Korrelation zwischen der Performance und der Anzahl von Texture-Lookups, denn die FPS-Werte aller Filter mit dem gleichen Radius liegen in der gleichen Größenordnung. Optimierungen können zwar die FPS-Rate steigern, unterliegen aber der Anzahl an Texture-Lookups als limitierendem Faktor.\\
Mit Ausnahme des trivialen Trilinearen Filters eignen sich daher die vorgestellten Filter nur bedingt für Echtzeitanwendungen - Standardhardware vorausgesetzt. Einige, wie der Lanczos Filter, bieten stattdessen eine gute Bildqualität und eignen sich für schwierige Volumen, wie dem von Marschner und Lobb. Andere, wie der Gauss Filter, können stark weichzeichnen und so Artefakte kaschieren. Daher entscheidet der Einsatzzweck über die Wahl des Filters.\\
Eine Mischform, bei der der Trilineare Filter bei Animationen und der Lanczos Filter für die Standbilder eingesetzt wird, eröffnet eine Kompromissmöglichkeit. 
